package main

import "fmt"

func main() {
	de := 10

	fmt.Printf("变量的地址: %x\n", &de)

	var a = 20  /* 声明实际变量 */
	var ip *int /* 声明指针变量 */

	fmt.Printf("ip 空指针地址: %x\n", ip)

	if ip != nil {
		fmt.Println("ip 是空指针")
	}

	ip = &a /* 指针变量的存储地址 */

	fmt.Printf("a 变量的地址是: %x\n", &a)

	/* 指针变量的存储地址 */
	fmt.Printf("ip 变量储存的指针地址: %x\n", ip)

	/* 使用指针访问值 */
	fmt.Printf("*ip 变量的值: %d\n", *ip)

	//指针存储数组
	bo := []int{10, 100, 200}
	MAX := len(bo)
	var i int
	var ptr [MAX]*int

	for i = 0; i < MAX; i++ {
		ptr[i] = &bo[i] /* 整数地址赋值给指针数组 */
	}

	for i = 0; i < MAX; i++ {
		fmt.Printf("a[%d] = %d\n", i, *ptr[i])
	}

	/* 定义局部变量 */
	var ac int = 100
	var ab int = 200

	fmt.Printf("交换前 a 的值 : %d\n", ac)
	fmt.Printf("交换前 b 的值 : %d\n", ab)

	/* 调用函数用于交换值
	* &a 指向 a 变量的地址
	* &b 指向 b 变量的地址
	 */
	swapww(&ac, &ab)

	fmt.Printf("交换后 a 的值 : %d\n", ac)
	fmt.Printf("交换后 b 的值 : %d\n", ab)
}

func swapww(x *int, y *int) {
	var temp int
	temp = *x /* 保存 x 地址的值 */
	*x = *y   /* 将 y 赋值给 x */
	*y = temp /* 将 temp 赋值给 y */
}
